﻿using System.Runtime.InteropServices;

namespace UPKAndUDKUnpackTools.Tools
{
    /// <summary>
    /// 静态类，提供创建符号链接的功能
    /// </summary>
    public static class SymbolicLinkCreator
    {
        /// <summary>
        /// 导入Windows API函数CreateSymbolicLink，用于创建符号链接
        /// </summary>
        /// <param name="lpSymlinkFileName">符号链接的路径</param>
        /// <param name="lpTargetFileName">目标文件的路径</param>
        /// <param name="dwFlags">标志，指示是文件链接还是目录链接</param>
        /// <returns>返回一个布尔值，指示链接是否成功创建</returns>
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
        private static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, SymbolicLink dwFlags);

        /// <summary>
        /// 枚举，用于指定符号链接的类型
        /// </summary>
        private enum SymbolicLink
        {
            /// <summary>
            /// 表示创建一个文件类型的符号链接
            /// </summary>
            File = 0
        }

        /// <summary>
        /// 从用户选择的文件夹中创建所有文件到指定目标文件夹的符号链接
        /// </summary>
        /// <param name="targetFolderName">目标文件夹的名称，符号链接将创建在此文件夹中</param>
        public static void CreateLinksFromSelectedFolder(string targetFolderName)
        {
            // 使用FolderBrowserDialog让用户选择一个文件夹
            using var folderDialog = new FolderBrowserDialog();
            folderDialog.Description = "请选择游戏TFC目录";
            if (folderDialog.ShowDialog() != DialogResult.OK) return;

            // 获取用户选择的路径
            var selectedPath = folderDialog.SelectedPath;

            // 构建目标目录的路径，并检查是否存在，如果不存在则创建
            var targetDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, targetFolderName);
            if (!Directory.Exists(targetDirectory))
            {
                Directory.CreateDirectory(targetDirectory);
            }

            // 获取用户选择的文件夹中的所有文件
            var files = Directory.GetFiles(selectedPath);

            // 遍历每个文件，尝试在目标目录中创建符号链接
            foreach (var file in files)
            {
                // 获取文件名，构建符号链接的路径
                var fileName = Path.GetFileName(file);
                var symlinkPath = Path.Combine(targetDirectory, fileName);

                // 检查符号链接是否已经存在
                if (File.Exists(symlinkPath))
                {
                    Console.WriteLine($"Symbolic link already exists: {symlinkPath}");
                    continue;
                }

                // 尝试创建符号链接
                var linkCreated = CreateSymbolicLink(symlinkPath, file, SymbolicLink.File);
                if (linkCreated)
                {
                    // 如果链接创建成功，将其设置为隐藏
                    File.SetAttributes(symlinkPath, FileAttributes.Hidden);
                    Console.WriteLine($"Symbolic link created and hidden: {symlinkPath} -> {file}");
                }
                else
                {
                    // 如果链接创建失败，输出错误信息
                    Console.WriteLine($"Failed to create symbolic link for: {file}");
                }
            }
        }
    }

}
